#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// #define ONLINE_GUDGE
#define lowbit(x) ((x) & (-x)) // 1个二进制有多少个1
const int N = 9, M = 1 << N;

//ones表示0-2^9里每个数有多少个1，map返回一个二进制数第一个1的位置
int ones[M], map[M];
//分别表示行，列，大方格子有哪些数字没有填
int row[N], col[N], cell[3][3];
char str[100];

void draw(int x, int y, int t, int is_set) // 位置 枚举数字  判断是放入还是删除
{
    if(is_set) str[x*N + y] = '1' + t;
    else str[x*N + y] = '.';

    int v = 1 << t;
    if(!is_set) v = -v;

    row[x] -= v;
    col[y] -= v;
    cell[x/3][y/3] -= v;
}

//x行y列可以填哪个数字, 最后得到2^i + 2^j..+..，这些i, j就是可以填的数字，最后通过map[2^i]来得到这个数字
inline int get(int x, int y) { // 小型九宫格的位置可以放的数，三条规则下这个数均可以放
    return row[x] & col[y] & cell[x / 3][y / 3];
}

int init()
{

    for(int i = 0; i < N; i++) row[i] = col[i] = (1 << N) - 1; // 初始情况下每个数都可以填
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            cell[i][j] = (1 << N) - 1;
}

bool dfs(int cnt)
{
    if(!cnt) return true; // 没有空格

    int minv = 10;
    int x, y;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            if(str[i*N+j] == '.')
            {
                int state = get(i, j);
                if(ones[state] < minv)
                {
                    minv = ones[state];
                    x = i, y = j;
                }
            }
    
    int state = get(x, y);
    for(int i = state; i; i -= lowbit(i))
    {
        int t = map[lowbit(i)];
        draw(x, y, t, true); // 在[x][y]处放入t
        if(dfs(cnt-1)) return true; // 当前路径有解
        draw(x, y, t, false); // 在[x][y]处删除t

    }
    return false; // 无解
    
}

int main()
{
    #ifdef ONLINE_GUDGE

    #else
        freopen("./in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0); cin.tie(0);

    //打表，快速地知道可以哪一个数字
    for(int i = 0; i < N; i++) map[1 << i] = i;

    //ones记录每个状态有多少个1，用于选择分支少的开始搜索, 其中M = 1 << N
    for(int i = 0; i < 1 << N; i++) {
        for(int j = 0; j < N; j++) {
            ones[i] += i >> j & 1;
        }
    }

    while(cin >> str, str[0] != 'e') 
    {
        init();
        int cnt = 0;
        for(int i=0,k=0;i<N;i++)
        //i,j遍历的是大九宫格上每个格子的位置，k遍历的是其在一维s中的位置
        {
            for(int j=0;j<N;j++,k++)
            {
                if(str[k]!='.') // 是数字
                {
                    int t=str[k]-'1';
                    draw(i,j,t,true);//如果初始数, 填入九宫格
                }
                else cnt++;
            }
        }
        dfs(cnt); // 根据空格填数
        puts(str);

    }

    return 0;
}

/*
  1 2 3 4 5 6 7 8 9
1 4 0 0 0 0 0 8 0 5
2 0 3 0 0 0 0 0 0 0
3 0 0 0 7 0 0 0 0 0
4 0 2 0 0 0 0 0 6 0
5 0 0 0 0 8 0 4 0 0
6 0 0 0 0 1 0 0 0 0
7 0 0 0 6 0 3 0 7 0
8 5 0 0 2 0 0 0 0 0
9 1 0 4 0 0 0 0 0 0
*/